/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package jpa.controller;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import jpa.controller.exceptions.NonexistentEntityException;
import jpa.entities.Contabilidad;
import jpa.entities.Venta;
import jpa.entities.Importacion;
import jpa.entities.Gasto;
import jpa.entities.Comprobante;

/**
 *
 * @author Usuario
 */
public class ContabilidadJpaController {

    public ContabilidadJpaController() {
        emf = Persistence.createEntityManagerFactory("Sig-ejbPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Contabilidad contabilidad) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Venta venta = contabilidad.getVenta();
            if (venta != null) {
                venta = em.getReference(venta.getClass(), venta.getIdVenta());
                contabilidad.setVenta(venta);
            }
            Importacion importacion = contabilidad.getImportacion();
            if (importacion != null) {
                importacion = em.getReference(importacion.getClass(), importacion.getIdImportacion());
                contabilidad.setImportacion(importacion);
            }
            Gasto gasto = contabilidad.getGasto();
            if (gasto != null) {
                gasto = em.getReference(gasto.getClass(), gasto.getIdgasto());
                contabilidad.setGasto(gasto);
            }
            Comprobante comprobante = contabilidad.getComprobante();
            if (comprobante != null) {
                comprobante = em.getReference(comprobante.getClass(), comprobante.getIdComprobante());
                contabilidad.setComprobante(comprobante);
            }
            em.persist(contabilidad);
            if (venta != null) {
                venta.getContabilidadList().add(contabilidad);
                venta = em.merge(venta);
            }
            if (importacion != null) {
                importacion.getContabilidadList().add(contabilidad);
                importacion = em.merge(importacion);
            }
            if (gasto != null) {
                gasto.getContabilidadList().add(contabilidad);
                gasto = em.merge(gasto);
            }
            if (comprobante != null) {
                comprobante.getContabilidadList().add(contabilidad);
                comprobante = em.merge(comprobante);
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Contabilidad contabilidad) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Contabilidad persistentContabilidad = em.find(Contabilidad.class, contabilidad.getIdContabilidad());
            Venta ventaOld = persistentContabilidad.getVenta();
            Venta ventaNew = contabilidad.getVenta();
            Importacion importacionOld = persistentContabilidad.getImportacion();
            Importacion importacionNew = contabilidad.getImportacion();
            Gasto gastoOld = persistentContabilidad.getGasto();
            Gasto gastoNew = contabilidad.getGasto();
            Comprobante comprobanteOld = persistentContabilidad.getComprobante();
            Comprobante comprobanteNew = contabilidad.getComprobante();
            if (ventaNew != null) {
                ventaNew = em.getReference(ventaNew.getClass(), ventaNew.getIdVenta());
                contabilidad.setVenta(ventaNew);
            }
            if (importacionNew != null) {
                importacionNew = em.getReference(importacionNew.getClass(), importacionNew.getIdImportacion());
                contabilidad.setImportacion(importacionNew);
            }
            if (gastoNew != null) {
                gastoNew = em.getReference(gastoNew.getClass(), gastoNew.getIdgasto());
                contabilidad.setGasto(gastoNew);
            }
            if (comprobanteNew != null) {
                comprobanteNew = em.getReference(comprobanteNew.getClass(), comprobanteNew.getIdComprobante());
                contabilidad.setComprobante(comprobanteNew);
            }
            contabilidad = em.merge(contabilidad);
            if (ventaOld != null && !ventaOld.equals(ventaNew)) {
                ventaOld.getContabilidadList().remove(contabilidad);
                ventaOld = em.merge(ventaOld);
            }
            if (ventaNew != null && !ventaNew.equals(ventaOld)) {
                ventaNew.getContabilidadList().add(contabilidad);
                ventaNew = em.merge(ventaNew);
            }
            if (importacionOld != null && !importacionOld.equals(importacionNew)) {
                importacionOld.getContabilidadList().remove(contabilidad);
                importacionOld = em.merge(importacionOld);
            }
            if (importacionNew != null && !importacionNew.equals(importacionOld)) {
                importacionNew.getContabilidadList().add(contabilidad);
                importacionNew = em.merge(importacionNew);
            }
            if (gastoOld != null && !gastoOld.equals(gastoNew)) {
                gastoOld.getContabilidadList().remove(contabilidad);
                gastoOld = em.merge(gastoOld);
            }
            if (gastoNew != null && !gastoNew.equals(gastoOld)) {
                gastoNew.getContabilidadList().add(contabilidad);
                gastoNew = em.merge(gastoNew);
            }
            if (comprobanteOld != null && !comprobanteOld.equals(comprobanteNew)) {
                comprobanteOld.getContabilidadList().remove(contabilidad);
                comprobanteOld = em.merge(comprobanteOld);
            }
            if (comprobanteNew != null && !comprobanteNew.equals(comprobanteOld)) {
                comprobanteNew.getContabilidadList().add(contabilidad);
                comprobanteNew = em.merge(comprobanteNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = contabilidad.getIdContabilidad();
                if (findContabilidad(id) == null) {
                    throw new NonexistentEntityException("The contabilidad with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Contabilidad contabilidad;
            try {
                contabilidad = em.getReference(Contabilidad.class, id);
                contabilidad.getIdContabilidad();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The contabilidad with id " + id + " no longer exists.", enfe);
            }
            Venta venta = contabilidad.getVenta();
            if (venta != null) {
                venta.getContabilidadList().remove(contabilidad);
                venta = em.merge(venta);
            }
            Importacion importacion = contabilidad.getImportacion();
            if (importacion != null) {
                importacion.getContabilidadList().remove(contabilidad);
                importacion = em.merge(importacion);
            }
            Gasto gasto = contabilidad.getGasto();
            if (gasto != null) {
                gasto.getContabilidadList().remove(contabilidad);
                gasto = em.merge(gasto);
            }
            Comprobante comprobante = contabilidad.getComprobante();
            if (comprobante != null) {
                comprobante.getContabilidadList().remove(contabilidad);
                comprobante = em.merge(comprobante);
            }
            em.remove(contabilidad);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Contabilidad> findContabilidadEntities() {
        return findContabilidadEntities(true, -1, -1);
    }

    public List<Contabilidad> findContabilidadEntities(int maxResults, int firstResult) {
        return findContabilidadEntities(false, maxResults, firstResult);
    }

    private List<Contabilidad> findContabilidadEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Contabilidad.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Contabilidad findContabilidad(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Contabilidad.class, id);
        } finally {
            em.close();
        }
    }

    public int getContabilidadCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Contabilidad> rt = cq.from(Contabilidad.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
